package com.kira.scaffoldmvc.HeartBeat;

import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;


// 线程开关屏障，控制线程是否允许通过
@Component
public class SwitchBarrier {

    // 基于AQS的同步器实例
    private Sync sync;

    // 内部同步器，继承AQS实现核心逻辑
    private static class Sync extends AbstractQueuedSynchronizer implements Serializable {
        // 构造方法，默认禁止通过
        Sync() {
            forbidCross(); // 默认关闭
        }

        //判断是否可以通过
        boolean canCross() {
            return getState() != 0;
        }

        //放行：设置状态为允许通过
        void allowCross() {
            setState(1);
        }

        //阻塞：设置状态为禁止通过
        void forbidCross() {
            setState(0);
        }

        // 尝试获取共享锁：状态为1则允许通过，0则禁止
        @Override
        protected int tryAcquireShared(int acquires) {
            return getState() == 0 ? -1 : 1;
        }

        // 释放共享锁：始终返回true，唤醒等待线程
        @Override
        protected boolean tryReleaseShared(int releases) {
            return true;
        }
    }

    // 初始化同步器
    public SwitchBarrier() {
        sync = new Sync();
    }

    // 对外提供的阻塞方法
    public void forbidCross() {
        sync.forbidCross();
    }

    // 对外提供的放行方法，同时唤醒等待线程
    public void allowCross() {
        sync.allowCross();
        sync.releaseShared(1);//唤醒所有等待通过屏障的线程
    }

    // 线程尝试通过，若禁止则阻塞
    public void cross() throws InterruptedException {
        sync.acquireSharedInterruptibly(0);
    }

    // 对外提供的状态查询方法
    public boolean canCross() {
        return sync.canCross();
    }


}